attribute vec4 aPosition;          // 顶点位置
attribute vec4 aTextureCoord;      // 纹理坐标
varying vec2 vTextureCoord;        // 传递给片元着色器的纹理坐标

uniform mat4 uMVPMatrix;           // 模型视图投影矩阵
uniform mat4 uSTMatrix;            // 纹理坐标变换矩阵

uniform float uTime;               // 当前时间，用来控制缩放和晃动
uniform float uDuration;           // 周期，控制缩放和晃动的基础速度
uniform float uMaxAmplitude;       // 最大振幅，控制缩放幅度
uniform float uMaxDisplacement;    // 最大位移，控制水平方向的晃动幅度
uniform float uMaxVerticalDisplacement; // 最大位移，控制垂直方向的晃动幅度
uniform float uFrequency;          // 速度调节参数

const float PI = 3.14159265359;

void main(void) {
    // 计算动画时间和周期
    float time = mod(uTime, uDuration);

    // 缩放因子，使用平滑的正弦函数来计算
    float smoothFactor = 0.5 - 0.5 * cos(time * (2.0 * PI / uDuration));  // Cos使得变化平滑
    float amplitude = 1.0 + uMaxAmplitude * smoothFactor;  // 平滑缩放因子

    // 左右晃动效果，sin波动与频率相关
    float displacement = uMaxDisplacement * sin(time * (2.0 * PI / (uDuration * uFrequency)));

    // 垂直方向晃动效果，sin波动与频率相关
    float verticalDisplacement = uMaxVerticalDisplacement * sin(time * (2.0 * PI / (uDuration * uFrequency)));

    // 对顶点位置应用缩放、晃动
    vec4 scaledPosition = vec4(aPosition.xyz * amplitude, aPosition.w); // 缩放应用

    // 水平方向和垂直方向的晃动
    //scaledPosition.x += displacement;   // 添加水平方向的位移

    //scaledPosition.y += verticalDisplacement;  // 添加垂直方向的位移

    // 应用 MVP 矩阵进行变换，得到最终位置
    gl_Position = uMVPMatrix * scaledPosition;

    // 传递纹理坐标
    vTextureCoord = (uSTMatrix * aTextureCoord).xy;
}
